package Model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import java.util.Date;

@Entity
@Table(name = "previsao")
@SuppressWarnings("serial")
public class Previsao implements Serializable {

   @Id
   @SequenceGenerator( name = "cod_previsao", sequenceName = "cod_prev_seq", allocationSize = 1 )
   @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "cod_previsao" )
   @Column (name = "cod_previsao")
   private int codPrevisao;

   @ManyToOne(fetch = FetchType.EAGER)
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   @JoinColumn(name = "cod_associado")
   private Associado associado;

   @Temporal(TemporalType.DATE)
   @Column(name = "data_inicio")
   private Date dataInicio;

   @Temporal(TemporalType.DATE)
   @Column(name = "data_fim")
   private Date dataFim;

   @OneToMany(mappedBy = "previsao", fetch = FetchType.EAGER, cascade=javax.persistence.CascadeType.MERGE)
   @Cascade(CascadeType.LOCK)
   private Collection<ItemPrevisao> itemPrevisao = new ArrayList<ItemPrevisao>();
   //Construtores
   //Construtor padrao
   public Previsao() {
      this.dataInicio = new Date();
      this.dataFim = new Date();
   }

   public Previsao(Integer codigo){
       codPrevisao = codigo;
   }
   //contrutor com parametros
   public Previsao(int codPrevisao,Associado associado, Date dataInicio, Date dataFim) {
      this.codPrevisao = this.getCodPrevisao();
      this.associado = associado;
      this.dataInicio = dataInicio;
      this.dataFim = dataFim;
   }

   //Metodos Get e Set
   public int getCodPrevisao() {
      return codPrevisao;
   }
   public void setCodPrevisao(int codPrevisao) {
      this.codPrevisao = codPrevisao;
   }

   public Date getDataInicio() {
      return dataInicio;
   }
   public void setDataInicio(Date dataInicio) {
      this.dataInicio = dataInicio;
   }

   public Date getDataFim() {
      return dataFim;
   }
   public void setDataFim(Date dataFim) {
      this.dataFim = dataFim;
   }

    public Associado getAssociado() {
        return associado;
    }

    public void setAssociado(Associado associado) {
        this.associado = associado;
    }

    public Collection<ItemPrevisao> getItemPrevisao() {
        return itemPrevisao;
    }

    public void setItemPrevisao(Collection<ItemPrevisao> itemPrevisao) {
        this.itemPrevisao = itemPrevisao;
    }

    public void adicionarItemPrevisao(ItemPrevisao item) {
        boolean contem = false;
        System.out.println ("A");
//        if (itemPrevisao.isEmpty()) {
//            System.out.println ("b");
//            itemPrevisao.add(item);
//             System.out.println ("c");
//        } else {
//            System.out.println ("aa");
            List<ItemPrevisao> itemPrev = (List<ItemPrevisao>) itemPrevisao;

            for (int i = 0; i < itemPrev.size(); i++) {
                if ((itemPrev.get(i).getProduto().getCodProduto() == item.getProduto().getCodProduto())) {
                    item.setCodItemPrevisao(itemPrev.get(i).getCodItemPrevisao());
                    itemPrev.remove(i);
                    itemPrev.add(i, item);
                    contem = true;
                }
            }
            if (!contem) {
                itemPrev.add(item);
            }
            setItemPrevisao(itemPrev);
//        }
    }

    @Override
 public int hashCode(){
     return codPrevisao;
 }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Previsao other = (Previsao) obj;
        if (this.codPrevisao != other.codPrevisao) {
            return false;
        }
        return true;
    }



}
